Minja

6 个小工具,打造图片批处理工作流 | 工作日志

对于多数文章来说,适当的配图是必不可少,尤其是一篇讲解技巧、评测 App 的文章,离开图就很难理解。

统计工作时间时,我也会特意分开记录打字和配图的时长,尽量真实反应自己的工作状态。

10% 的时间在配图

上图是我最近写 Power+ 文章的耗时。尽管我已经用上了各路自动化工具,仍然有 10% 的时间花在配图上。

不难看出,相比文章撰写,配图制作的工作量也不小。编辑部的成员,不仅要处理自己文章的配图,出于网站视觉统一的考虑,还要把投稿1

尤其是付费内容。
 中的配图修缮一番。

为了给原创性的写作工作腾出更多时间,我一直改进自己的图片处理流程,将其中的机械部分做成自动化动作。一年工作下来,也积累了不少原创小工具:拼接图片、调整尺寸、加阴影、移除信息、转换格式……这些动作,原理上有很多类似之处,又都围绕图片处理这一主题,所以我把它们汇总起来分享给大家。当然,即使你并不常写文章,这些小工具在 PPT 制作、海报编排等工作中也派得上用场。

使用前的准备

我日常用的自动化工具是 LaunchBar,所以本文例图展示的都是 LaunchBar 的场景,不过所有动作都可以移植到 Automator、AlfredKeyboard Maestro 等其他自动化工具上。

无论下载哪个版本的动作,都需要这两个准备工序:

  • 安装 HomeBrew:为方便一会儿装别的第三方图片处理工具。在 Terminal 输入:

    /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

  • 安装 imagemagick:这是一个免费的命令行图片处理工具,虽然没有图形界面,但也因此可以和各种自动化工具打包在一起批量处理图片,而且相比图形化的工具可拓展性更高,有兴趣的读者可以把动作串联起来使用,或者在处理完图片后进行归档、上传到图床等操作。安装 imagemagick 需在 Terminal 输入
    brew install imagemagick

LaunchBar 动作下载后建议重命名文件。为了方便识别,我提供的部分动作可能是中文名的,但你得换一个英文名或拼音名,不然 LaunchBar 无法显示它们。

LaunchBar 动作

Automator 动作下载安装后可以直接在右键菜单中看到。

Automator 动作会出现在右键菜单里

令人宽心的是,这些动作在使用时全程不用打开 Terminal,也用不着输入任何代码。下面我们来看看这些动作是怎样工作的,并重点了解一下我们可以自定义的部分。

拼接图片

拼接图片听起来毫无技术含量,不过大家不妨回忆一下,一般人在 Mac 上是怎么操作的?你可以观察一下身边的人,相信绝大多数都是把几张图片导入 Photoshop,手动对齐,再导出新图片。这一轮操作下来,固然耗时不多,但每天处理十几张配图就能让人怀疑自己的工作意义。机械的事情当然要尽可能交给自动化工具。

在 imagemagick 里,我们可以横向、也能纵向拼接多张图片,并且可以预设间距、背景颜色,免去手动导入、拖拽的麻烦。具体会用到这两条代码:

  • 横向拼接:convert 图片1 图片2 图片3 … -background none +append 输出图片
  • 纵向拼接:convert 图片1 图片2 图片3 … -background none -append 输出图片

其中 -background none 可能稍有些费解,其实它表示采用透明背景,毕竟实际操作中我们常常遇到需拼接的图片尺寸不同的情况,此时对不齐、多出来的部分若是塞上一块色块就会很难看,用一个透明背景则会让成品图更自然。

拼接效果对比,加工前的色块很碍眼

当然,你不会希望每次都敲一遍命令的,所以了解完 imagemagick 拼接图片的原理后,我们就把命令整合进 LaunchBar。所幸 LaunchBar 对变量的输入输出控制得非常好,我们一次性导入多张图片也没有问题。

以横向拼图为例,在 LaunchBar 里新建一个动作(如果你不知道怎样新建,可以看 这篇文章,动作的设置也是一样的)把下面的代码直接拷贝进去:

PATH=$PATH:/usr/local/bin/

ARG="$1"
ddate=`date +%Y-%m-%d-%H%M%S`
ooutput="${ARG%/*}/concact-$ddate.png"

convert "$@" -background none +append "$ooutput" && afplay "/System/Library/Sounds/Submarine.aiff"

至于纵向拼图的代码,其实只是把 +append 换成 -append,你可以自己完成,这里不重复贴出了。

我对于基础的拼图命令做了点优化,把生成的图片命名为 concact-当前日期时间,避免和原有的文件冲突,并且新图和原图放在同一个文件夹里。另外,在图片处理成功后还会发出提示音,如果你不喜欢听到频繁的通知音,可以直接删除  && afplay "/System/Library/Sounds/Submarine.aiff"  这一部分。

在使用的时候,图片会根据被选中的先后从左到右或从上到下地排布,如果你希望某一张图片排在前面,就先选中它,再点选其他图片。每期编排 Shortcuts Gallery 上新文章时,拼图动作都可以节省我打开专业修图软件的时间。

横向拼接图片

横向/纵向拼图这组动作我用了很久了,也和一些读者分享过,他们发掘出了更多的应用场景。比如 @谭小熊 就反馈过一个意想不到的用法:制作照片墙

照片墙

这种人头攒动的图大家在各种公益活动上都看过,但你可能不知道,不少主办机构都是一张一张手动拼接的,非常低效;谭小熊则把图片分成几组,横向拼了几行,再纵向拼在一起,几分钟就完成了拼图。看到自己的动作被读者活用,没有什么比这更让制作者开心的。

知识点一

注意脚本第一行:PATH=$PATH:/usr/local/bin/。以后每次使用 imagemagick 时,都会出现这段代码,它的用途是指明第三方命令行工具在电脑里的位置,不然自动化工具就拔剑四顾心茫然,不知道命令位于何处了。

知识点二

想看看一个命令有没有运行成功?那就在它后面加上这一段代码:

 && afplay "/System/Library/Sounds/Submarine.aiff" 
&& 表示如果命令运行成功,就运行后面的代码——后面紧跟着的那串代码就是拿来发出提示音的,你可以在 /System/Library/Sounds/ 文件夹里找到自己喜欢的音效替换掉 Submarine。

给截图加阴影

Mac 上的窗口截图自带阴影,看起来比较美观,也能让图片和白色的网页背景区分开来。

适当的阴影可以让图片和背景区分开来

但是选区截图没有阴影,需要我们手动添加。为了这么一个简单的操作而动用重量级图片处理工具实在是牛鼎烹鸡,我们还是用 imagemagick 里的命令

convert 输入的图片路径 \( +clone  -background balck  -shadow 80x20+0+10 \) +swap -background none -layers merge  +repage 输出的图片路径

只需要注意其中 80x20+0+10 这段参数:

  • 20阴影柔软度。数字越大阴影越柔和,一般设置为 10 到 30,和 macOS 原生的截图看起来比较接近,依据喜好你可以自己修改。
  • +0+10阴影位置。上面的代码表示向下移动 10 个单位(0 表示不向右移动),一般不用改。

同样把命令封装成 LaunchBar 动作,下面是代码:

PATH=$PATH:/usr/local/bin/

idx=0

for f in "$@";do
    full_name=${f%.*}
    extension=${f##*.}
    newFile=${full_name}_new.$extension
    convert "$f" \( +clone -background black -shadow 50x10+0+10 \) +swap -background none -layers merge +repage  "$newFile"
    let idx=$idx+1
done && afplay "/System/Library/Sounds/Submarine.aiff"

osascript -e "display notification \"$(echo 修改了 $idx 个文件)\""

又出现了不少和 imagemagick 无关的代码?多出来的部分是为了统计处理了多少图片,并且最后发送通知作为提醒的。

考虑到 imagemagick 的命令是不可撤销的,我提供的动作会生成一个带阴影的新文件,不至于覆盖源文件,给你一剂后悔药。

效果如下:

添加阴影前后对比

知识点三

osascript -e “display notification "$(echo 修改了 $idx 个文件)"”

这段代码是拿来发送系统通知的,方便我们得知 LaunchBar 的处理结果。里面还有一处 $idx,它表示 LaunchBar 动作处理文件的数量,这部分内容超纲较多,也不影响动作的核心功能,以后的文章里我们再讨论。

移除照片 EXIF 信息

这个动作比较简单,就是移除照片的 EXIF 信息(拍摄地点、设备等细信息),一般是出于隐私考虑。

在上传照片之前,我都习惯进行这么一步操作,就和士兵永远会假设枪膛里有子弹一样,我默认所用的照片里都含有 EXIF 信息,一概要处理一下。此时通过 LaunchBar 调用 imagemagick 出来就挺方便,可以不打开任何图片处理工具,原地拔除 EXIF 信息。

移除 EXIF 信息

用到的命令相当简单,仅仅一句 mogrify -strip 图片,打包后代码如下:

PATH=$PATH:/usr/local/bin/

idx=0

for f in "$@";do
    mogrify -strip "$f"
    let idx=$idx+1
done && afplay "/System/Library/Sounds/Submarine.aiff"

osascript -e "display notification \"$(echo 修改了 $idx 个文件)\""

大家可以试试用到其他自动化工具里面。

批量调整尺寸

现在,来看一个很常见的操作:修改图片尺寸。一般我们会用预览工具打开图片(Photoshop 实在是大动干戈),改一下大小,然后保存。不过每次要很画蛇添足地选一下是否按比例缩放,而且图片一多还容易卡顿。

预览工具不够简洁

老样子,自己动手。查过文档后,我发现 imagemagick 带有一个 convert -resize 命令,可以修改图片尺寸。

convert -resize 尺寸 原图片 新图片

稍作修改,填到 LaunchBar 里去。这里涉及一个输入图片尺寸的问题,想要随时输入尺寸,就要借助一大段 AppleScript 来召唤出系统输入框。好在这部分代码没有什么值得自定义的内容,唯一值得一提的就是默认宽度 900 可以改成别的尺寸。关于 AppleScript,我还会另有专门的系列文章,这里不深究。

read -r -d '' applescriptCode1 <<'EOF'
    set imgWidth to text returned of (display dialog "请输入图片宽度" default answer "900")
    return imgWidth
EOF

imgWidth=$(osascript -e "$applescriptCode1")

for ARG in "$@"; do
    PATH=$PATH:/usr/local/bin/
    convert -resize $imgWidth "$ARG" "$ARG"
done && afplay "/System/Library/Sounds/Submarine.aiff"
调整分辨率

对于一些频繁接触的像素尺寸,你还可以做专门的动作。我就搞过一个把图片宽度调成 1440 像素的动作,投过稿的读者可能已经会意:这不就是少数派文章题图的尺寸嘛!

快速把图片宽度调到和少数派题图相符

批量转换格式

上面的动作都用到了 imagemagick,可以说是拓展了 macOS 的图片处理功能。最后一个动作是批量转换图片格式,只用到原生命令,其实是对预览工具、快速查看工具中修图功能的简化,不过同样很泛用,不仅是编排文章,日常发个贴、写个推也能用到。

最常见的转换是把 PNG 转成 JPG,可以压缩一部分体积。而在知乎、微博等服务里,JPG 图片还有避免显示出错的用处:PNG 图片由于带着透明像素——比如截图那一圈儿的阴影——就会被自动加上粗大的黑边(有时甚至直接套上一层绿色),看起来很糟。

在知乎上传 PNG 图片,会被加上黑底(右)

在这类网站和服务里上传图片前,还是自己转换一下格式比较保险。除了 JPG 和 PNG,自己折腾图标、绘制插画时也会遇到 TIFF、ICNS 等格式的图片,如何把它们转换成常用格式也是个问题。于是我做了一个动作,支持把多种图片批量转换成常见的格式(PNG 或 JPG)。其实 Automator 自己也有个图片格式转换功能,我重新做一个主要是为了配合其他自动化动作。

批量转换格式

调整图片格式不需要依靠 imagemagick,所以这回我们没有在脚本开头填写环境变量。

read -r -d '' applescriptCode1 <<'EOF'
    set formatList to {"png", "jpeg"}
    choose from list formatList
    return result
EOF

ffotmat=$(osascript -e "$applescriptCode1")

idx=0

for f in "$@";do
    sips -s format $ffotmat --out "${f%.*}.$ffotmat" "$f"
    let idx=$idx+1
done && afplay "/System/Library/Sounds/Submarine.aiff"

osascript -e "display notification \"$(echo 修改了 $idx 个文件)\""

运行这个动作后,你会看到一个格式选单,选好后就能生成一堆指定格式的图片了。

小结

说到图片处理,我们常常想到 Photoshop、Pixelmator Pro 这些较为专业的工具,但并不是所有的图片都需要请它们出马解决。是 Shortcuts 让我意识到,套壳截图、拼接多张图片等机械而频繁的操作,完全可以交给自动化的工具,就像使用稻谷脱壳机一样,把图片丢进去,你不用管机器内部是怎么运行的,也不用干预它的工作,符合预期的成品就会出来。

在 Shortcuts 里拼图、套壳

在我看来,Shortcuts 其实是帮你做好了「半成品菜」,你稍微组合、修改一下就能马上弄出一个可以反复使用的自动化动作。Mac 上缺少那么省力的工具,但也有办法,比如利用命令行工具。而每次输入命令显然不方便,这就是 LaunchBar、Automator、Keyboard Maestro 等自动化工具的一大长处,它们可以把复杂的命令打包起来,即使是完全不懂命令行的人也能无障碍使用。

只不过,别人做的动作不一定总是适合你,所以我在分享动作的同时,更喜欢讨论动作怎么实现、怎样修改。是在那儿干等着别人提供工具,还是自己学一点点知识、解决一部分问题,就看你的选择了。


70

您好,为了保护少数派用户创造的内容、维护良好的社区氛围,我们将从 2019 年 6 月 10 日起实行新的《少数派评论规范》,具体内容您可以通过相关页面了解,感谢您对少数派的理解与支持。(๑•ᴗ•๑)

精选评论 (6)

我的评论

geekdada
做了一个 Alfred 移植版:https://naas.cat/image-actions
sonkei
牛,这两天刚好在研究magick,因为有将图片压缩成固定数据量的需求,目前看只有magick可以做到按照总像素数进行转换的能力。
21
哭了,终于等到这一篇 (虽然看着有点难,但我必须好好钻研一下)
geekdada
Minja 是硬核 LaunchBar 玩家
棉花老闆
对我来说,这是 2.0 最值钱的一篇了
VctN
Cool 👍

目录

使用前的准备

拼接图片

给截图加阴影

移除照片 EXIF 信息

批量调整尺寸

批量转换格式

小结